﻿using System;
using System.Collections.Specialized;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace AnOtherBlog.Core.Providers.SQL
{
	/// <summary>
	/// Clase derivada que facilita el acceso a datos en un 
	/// motor de base de datos Microsoft SQL Server 2005
	/// </summary>
	/// <remarks>
	/// Se utiliza partial porque vamos a tratar de mantener 
	/// por separado los métodos de cada clase 
	/// </remarks>
	public partial class SQLDataProvider : DataProvider
	{

		#region Fields and Properties
		private string _ConnectionStringName;
		/// <summary>
		/// Obtiene la cadena de conección del web.config
		/// utiliza el nombre de cadena establecido en el proveedor de datos
		/// </summary>
		public string ConnectionString
		{
			get
			{
				return ConfigurationManager.ConnectionStrings[_ConnectionStringName].ConnectionString;
			}
		}

		#endregion

		#region Fields and Properties for this DataProvider
		/// <summary>
		/// Entrega una conección a la base de datos
		/// </summary>
		protected SqlConnection DataConnection
		{
			get
			{
				return new SqlConnection(ConnectionString);
			}
		}

		#endregion

		#region DataProvider Initialization
		/// <summary>
		/// Nombre del proveedor de datos
		/// </summary>
		public override string Name
		{
			get
			{
				return "SQLDataProvider";
			}
		}
		/// <summary>
		/// Descripción del proveedor de datos
		/// </summary>
		public override string Description
		{
			get
			{
				return "SQL Server 2005 Data Provider";
			}
		}

		/// <summary>
		/// Constantes para manipular la información del Web.Config 
		/// </summary>
		const string DESCRIPTION = "description";
		const string CONNECTIONSTRINGNAME = "connectionStringName";

		/// <summary>
		/// Initializes the provider
		/// </summary>
		/// <param name="name">Configuration name</param>
		/// <param name="config">Configuration settings</param>
		public override void Initialize(string name, NameValueCollection config)
		{
			if (config == null)
			{
				throw new ArgumentNullException("config");
			}
			if (String.IsNullOrEmpty(name))
			{
				name = this.Name;
			}
			if (String.IsNullOrEmpty(config[DESCRIPTION]))
			{
				config.Remove(DESCRIPTION);
				config.Add(DESCRIPTION, this.Description);
			}
			base.Initialize(name, config);

			if (config[CONNECTIONSTRINGNAME] == null)
			{
				config[CONNECTIONSTRINGNAME] = "AnOtherBlog";
			}
			_ConnectionStringName = config[CONNECTIONSTRINGNAME];
			config.Remove(CONNECTIONSTRINGNAME);
		}

		#endregion



	}
}
